import java.util.*;

public class 字符串 {

    //字符串按模式排序
    public static String customSortString(String order, String s) {
        StringBuffer res = new StringBuffer();
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
        }
        for (int i = 0; i < order.length(); i++) {
            char c = order.charAt(i);
            int n = map.getOrDefault(c, 0);
            for (; n > 0; n--) {
                res.append(c);
            }
            map.remove(c);
        }
        for (char c : map.keySet()) {
            int n = map.get(c);
            for (; n > 0; n--) {
                res.append(c);
            }
        }
        return res.toString();
    }

    //1796. 字符串中第二大的数字
    public static int secondHighest(String s) {
        int f1 = -1, f2 = -1;
        for (int i = 0; i < s.length(); i++) {
            int n = s.charAt(i) - '0';
            if (n < 10 && n > -1) {
                if (n > f2) {
                    f1 = f2;
                    f2 = n;
                } else if (n == f2)
                    continue;
                else if (f1 < n)
                    f1 = n;
            }
        }
        return f1;
    }

    public static String reverseStr(String s, int k) {
        StringBuffer res = new StringBuffer();
        int m = s.length();
        int c = m / k;
        int q = 0;
        while (q < c) {
            int base = q * k;
            res.append(new StringBuffer(s.substring(base, base + k)).reverse());
            q++;
            if (q < c) {
                res.append(new StringBuffer(s.substring(base + k, base + 2 * k)));
            }
            q++;
        }
        if (c * k < m)
            res.append(new StringBuffer(s.substring(c * k)));


        return res.toString();
    }

    //38. 外观数列
    public static String countAndSay(int n) {
        StringBuffer first;
        StringBuffer res = new StringBuffer("1");
        while (n > 1) {
            first = res;
            res = new StringBuffer();
            for (int i = 0; i < first.length(); i++) {
                int l = 1;
                char c = first.charAt(i);
                while (i + 1 < first.length() && first.charAt(i + 1) == c) {
                    i++;
                    l++;
                }
                res.append(l);
                res.append(first.charAt(i));
            }
            n--;
        }
        return res.toString();
    }

    public static List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        HashMap<String, List<Integer>> hashMap = new HashMap<>();
        int length = strs.length;
        for (int i = 0; i < length; i++) {
            int[] counts = new int[26];
            String str = strs[i];
            for (int j = 0; j < str.length(); j++) {
                counts[str.charAt(j) - 'a']++;
            }
            StringBuffer key = new StringBuffer();
            for (int j = 0; j < 26; j++) {
                key.append('!');
                key.append(counts[j]);
            }
            List<Integer> orDefault = hashMap.getOrDefault(key.toString(), new ArrayList<>());
            orDefault.add(i);
            hashMap.put(key.toString(), orDefault);
        }
        for (List<Integer> list : hashMap.values()) {
            List<String> list1 = new ArrayList<>();
            for (int n : list) {
                list1.add(strs[n]);
            }
            res.add(list1);
        }
        return res;
    }

//    public static List<String> restoreIpAddresses(String s) {
//
//    }
//
//    public static void df3(List<String> res, String s, int temp, int index, int ge) {
//        if (temp > 256 || index >= s.length())
//            return;
//        int t = s.charAt(index) - '0';
//        int last = temp * 10 + t;
//        if (ge == 3) {
//            res.add('.' + s + temp);
//            if(last<256)
//                df3(res,s,last,index+1,ge);
//
//        } else {
//            ge++;
//            df3(res, );
//        }
//    }

    public static void main(String[] args) {
//        System.out.println(customSortString("cbafg", "abcd"));
//        System.out.println(secondHighest("dfa12321afd"));
//        System.out.println(reverseStr("abcdefg", 8));
//        System.out.println(countAndSay(5));
        groupAnagrams(new String[]{"eat"});
    }
}
